package com.hjx.other;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 利用LinkedHashMap的特性来实现lru
 * LinkedHashMap是链表结构,对于增加、删除、查找等操作都很快
 * 每次添加新的元素会将元素放在尾节点
 * 通过一点小小的改变，可以使每次get的节点移到尾节点，所以头节点就是最近最少使用的节点了
 *
 * @author hsf
 * @date 2019/10/19 14:46
 */
@Deprecated
public class LruHashMap<K, V> extends LinkedHashMap<K, V> {
    /** 初始容量 */
    private static final int INITIAL_CAPACITY = 16;
    /** 负载因子 */
    private static final float LOAD_FACTOR = 0.75f;
    /** 最大容量 */
    private final int maxCapacity;

    public LruHashMap(int maxCapacity) {
        //这里将accessOrder参数改为true,使每一次访问key之后,会把这个key放到链表的最后面
        super(INITIAL_CAPACITY, LOAD_FACTOR, true);
        this.maxCapacity = maxCapacity;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        //达到我们限定的容量后,返回true
        //返回true会导致链表的头节点被删除
        return size() > maxCapacity;
    }


    public static void main(String[] args) {
        LruHashMap<String, Integer> map = new LruHashMap<>( 20);
        for (int i = 0; i < 25; i++) {
            map.put(String.valueOf(i), i);
            if (i % 5 == 0) {

                String a = String.valueOf(i % 3);
                System.out.println("最近使用" + a);
                map.get(a);
            }
        }
        System.out.println(map.toString());
    }
}